vector的erase() |
您所在的位置:网站首页 › i have a eraser对吗 › vector的erase() |
erase的函数原型有两种形式: iterator erase(iterator position);//删除单个位置 iterator erase(iterator first, iterator last);//删除一段在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素。 删除一段段元素之后,后面的元素(从iter_end开始到vector.end())会被复制到被删除元素段开始的地方(iter_begin开始),而vector.end()也根据删除的元素个数往前移动。 总结:erase操作传入迭代器,迭代器所指位置在删除前后不发生改变,改变的只是容器中元素值。删除该元素后,被删元素后面的所有元素复制到被删元素位置上,尾部迭代器也移动到新的尾部位置。 注意事项:对vector中的数据进行去除的时候,最好是用C++的迭代器,这样不容易出错。 vector veci; veci.push_back(1); veci.push_back(2); veci.push_back(3); veci.push_back(4); veci.push_back(5); veci.push_back(3); veci.push_back(2); veci.push_back(3); for(vector::iterator iter=veci.begin(); iter!=veci.end(); iter++) { if( *iter == 3) veci.erase(iter); }问题:其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。 应该改为: for(vector::iterator iter=veci.begin(); iter!=veci.end(); iter++) { if( *iter == 3) iter = veci.erase(iter); }这段代码也是错误的:1)无法删除两个连续的"3"; 2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作) for(vector::iterator iter=veci.begin(); iter!=veci.end(); ) { if( *iter == 3) iter = veci.erase(iter); else iter ++ ; }
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |